package com.coveo.blitz;
import static org.fest.assertions.api.Assertions.*;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.*;
import java.util.Arrays;
import org.apache.http.client.utils.URIBuilder;
import org.apache.thrift.protocol.TJSONProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.server.TServlet;
import org.apache.thrift.transport.THttpClient;
import org.apache.thrift.transport.TTransport;
import org.apache.thrift.transport.TTransportException;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import com.coveo.blitz.thrift.AwesomeService;
import com.coveo.blitz.thrift.DataPoint;
import com.coveo.blitz.thrift.Request;
import com.coveo.blitz.thrift.Response;
public class ThriftHttpTest
{
private static final int SERVER_PORT = 50091;
private AwesomeService.Iface mockedServer;
private Server server;
@Before
public void spawnServer() throws Exception
{
server = new Server(SERVER_PORT);
ServletHandler handler = new ServletHandler();
mockedServer = Mockito.mock(AwesomeService.Iface.class);
when(mockedServer.getData(any(Request.class))).thenReturn(new Response(Arrays.asList(new DataPoint(),
new DataPoint())));
AwesomeService.Processor<AwesomeService.Iface> processor = new AwesomeService.Processor<>(mockedServer);
ServletHolder holder = new ServletHolder(new TServlet(processor, new TJSONProtocol.Factory()));
handler.addServletWithMapping(holder, "/*");
server.setHandler(handler);
server.start();
}
@After
public void tearDown() throws Exception
{
if (server != null && server.isRunning()) {
server.stop();
}
}
@Test
public void testHttp() throws Exception
{
Request request = new Request();
Response r = createClient().getData(request);
assertThat(r.getData()).hasSize(2);
Mockito.verify(mockedServer).getData(request.deepCopy());
}
private AwesomeService.Client createClient() throws TTransportException
{
URIBuilder uriBuilder = new URIBuilder();
uriBuilder.setScheme("http");
uriBuilder.setHost("localhost");
uriBuilder.setPort(SERVER_PORT);
TTransport transport = new THttpClient(uriBuilder.toString());
transport.open();
TProtocol protocol = new TJSONProtocol(transport);
return new AwesomeService.Client(protocol);
}
}